package cn.itcast.bos.action.base;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.struts2.convention.annotation.Action;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;
import com.opensymphony.xwork2.ActionContext;

import cn.itcast.bos.domain.base.Area;
import cn.itcast.bos.service.base.AreaService;
import cn.itcast.fore.web.action.common.BaseAction;

@Controller // bean组件
@Scope("prototype") // 多例
public class AreaAction extends BaseAction<Area> {
	@Autowired
	private AreaService areaService;
	// 文件上传
	// 文件 名字必须和input name="upload"一样
	private File upload;
	// 文件名，xxx+FileName
	private String uploadFileName;
	// 文件的mime类型，xxx+ContentType
	private String uploadContentType;

	public void setUpload(File upload) {
		this.upload = upload;
	}

	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	// 导入excel的区域数据
	@Action("area_importData")
	public String importData() {
		// 定义一个集合存放区域
		List<Area> areaList = new ArrayList<Area>();
		// map存放导入结果
		HashMap<String, Object> resultMap = new HashMap<>();
		try {

			// 目标：读取excel文件的内容
			// poi-hssf(97格式)：记忆方式：平时怎么读一个excel，这里就怎么写代码
			// 1)打开工作簿(获取要导入的表)
			XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(upload));
			//// Workbook book = null;
			// try {
			// book = new XSSFWorkbook(upload);
			// } catch (Exception ex) {
			// book = new HSSFWorkbook(new FileInputStream(upload));
			// }
			// 2)打开指定的工作表(获取要导入表的第一页)
			XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
			// hssfWorkbook.getSheet("Sheet1");//根据表的名字来读
			// 3)一行一行的读
			for (Row row : sheet) {
				// 略过第一行：第一行往往是标题（指导用户填写表格）

				if (row.getRowNum() == 0) {
					continue;
				}
				// 创建一个实体类对象(封装获取的读取的数据)
				Area area = new Area();
				// getCell(0).getStringCellValue()导入的excel导入时格中的数据类型全部用String类型
				// 读取行的数据(行是由格组成的，一格一格的读,这个获取的是对应Area表中的id)
				String id = row.getCell(0).getStringCellValue();// 获取的是第一格数据
																// 区域编号
				String province = row.getCell(1).getStringCellValue();// 获取的是第二格数据
																		// 省份
				String city = row.getCell(2).getStringCellValue();// 获取的是第三格数据
																	// 城市
				String district = row.getCell(3).getStringCellValue();// 获取的是第四格数据
																		// 城市区域
				String postcode = row.getCell(4).getStringCellValue();// 获取的是第五格数据
																		// 邮编
				// 封装到Area实体类中
				area.setId(id);
				area.setProvince(province);
				area.setCity(city);
				area.setDistrict(district);
				area.setPostcode(postcode);
				// 处理区域简码和城市编码
				// 区域简码:先拼接中文，再转成英文
				// 省
				String strProvince = StringUtils.substring(province, 0, -1);
				// 市
				String strCity = StringUtils.substring(city, 0, -1);

				// 区
				String strDistrict = StringUtils.substring(district, 0, -1);
				// 拼接转换
				String shortcode = PinyinHelper.getShortPinyin(strProvince + strCity + strDistrict).toUpperCase();
				// 城市编码
				// 转换
				// 参数1：要转换的字符串
				// 参数2：转换后的拼音之间的分隔符
				// 参数3：拼音的格式：
				// 拼音格式：WITH_TONE_NUMBER--数字代表声调，WITHOUT_TONE--不带声调，WITH_TONE_MARK--带声调
				String citycode = PinyinHelper.convertToPinyinString(strCity, "", PinyinFormat.WITHOUT_TONE).toUpperCase();
				// 城市编码
				area.setCitycode(citycode);

				// 简码封装到bean中
				area.setShortcode(shortcode);
				// 将区域添加到集合中
				areaList.add(area);

			}
			// 调用业务层保存
			areaService.saveArea(areaList);
			// 成功
			resultMap.put("result", true);
		} catch (Exception e) {
			e.printStackTrace();
			// 失败
			resultMap.put("result", false);
		}
		// 压入栈顶
		ActionContext.getContext().getValueStack().push(resultMap);

		return JSON;

	}
}
